#ifndef FORMPICPROC_H
#define FORMPICPROC_H

#include <QFrame>
#include <QLabel>
#include <QString>
#include <QColorDialog>
#include <QLineEdit>
#include <QTextEdit>
#include <QGroupBox>
#include <QVBoxLayout>
#include <QVector>
#include <QFileDialog>
#include <QPropertyAnimation>
#include "design/CustomCheckBox.h"
#include "design/CustomSpinBox.h"
#include "tools/util.h"
#include <tuple>

#define IMAGE_INDEX_INVALID (-1)

/// 图片详细信息结构体
typedef struct _IMG_INFO_S_
{
    uint        iWidth;         // 图片宽度
    uint        iHeight;        // 图片高度
    QString     strFormat;      // 图片格式

    // 清空已有数据
    void clear()
    {
        iWidth = 0;
        iHeight = 0;
        strFormat.clear();
    }
}IMG_INFO_S;

// 图片展示画面
class ImgLabel : public QLabel
{
    Q_OBJECT

public:
    ImgLabel(QWidget* parent = nullptr);
    ~ImgLabel() {}
    void setFile(const QString& strFile);
   // bool getSize(uint &nWidth, uint &nHeight);
    bool getCurImg(QImage& img);
protected:
    // 接收拖拽事件
    void dragEnterEvent(QDragEnterEvent* event);
    // 根据拖拽文件，读取并展示
    void dropEvent(QDropEvent* event);
    // 变更界面显示比例
    void resizeEvent(QResizeEvent* event);
    
private:
    // 刷新展示图片
    void showImage(QImage pImage);
signals:
    // 发送点击信号到上层
    void sendImgInfo(uint, uint, QString);
private:
    QImage m_ImgShow;
};

// 参数配置界面
class PicParam : public QFrame
{
    Q_OBJECT
public:
    PicParam(QWidget* parent = nullptr);
    ~PicParam() {}
    bool getPicParam(bool& bNormalize, uint& nLineSize, QVector<std::tuple<float, float, float, float>>& vecPoints);

private slots:
    void slt_ColorSelected(const QColor& color);
    void slt_OpenColorDialog();
    void slt_NormalizeType(uint nIndex);
    void slt_InputType(uint nIndex);
    void slt_updateImgInfo(uint nWidth, uint nHeight, QString strType);

private:
    IMG_INFO_S m_stImgInfo;
    QColorDialog* m_pColorDialog;
    QLabel* m_pPathInfo;
    QLabel* m_pImgHeight;
    QLabel* m_pImgWidth;
    CustomSpinBoxInt* m_pLineWidth;
    QPushButton* m_pColor;
    CustomCheckBoxList* m_pNormalize;

    QLineEdit* m_pLineInputWidth;
    QLineEdit* m_pLineInputHeight;
    QLineEdit* m_pLineInputXPoint;
    QLineEdit* m_pLineInputYPoint;
    CustomCheckBoxList* m_pInputType;
    QTextEdit* m_pMessageInput;
};


class FormPicProc : public QFrame
{
    Q_OBJECT
public:
    FormPicProc(QWidget* parent = nullptr);
    ~FormPicProc() {}
private slots:
    // 打开文件
    void slt_openFile();
    // 保存文件
    void slt_save();
    // 返回上一张图（如有）
    void slt_back();
    // 跳到下一张图（如有）
    void slt_next();
    // 绘制参数输入
    void slt_showPaintParams();
    // 接收坐标参数并在图片上绘制
    void slt_paintWithParams();
private:
    void reshow(const bool bShow);
    void reshowAnimat(const bool bShow);
protected:
    void resizeEvent(QResizeEvent* event) override;

private:
    QFileDialog*        m_fileDialog;       // 保存选择窗口
    ImgLabel*           m_pImgLabelShow;    // 图片展示区域
    PicParam*           m_pPicParam;        // 参数配置区域
    QFrame*             m_pToolFrame;
    std::vector<QImage> m_vecImages;        // 图片列表
    QPropertyAnimation* m_pAnimationImage;
    QPropertyAnimation* m_pAnimationParam;
};

#endif // FORMPICPROC_H
